# 导入 OpenCV 库，用于图像处理
import cv2
# 导入 NumPy 库，用于数值计算
import numpy as np
# 导入 argparse 模块，用于解析命令行参数
import argparse  # 新增：引入 argparse 模块

# 定义图像预处理函数
def preprocess_image(image_path):
    # 读取灰度图像
    image = cv2.imread(image_path, 0)
    # 使用高斯模糊进行降噪
    blurred = cv2.GaussianBlur(image, (5, 5), 0)
    # 使用自适应阈值进行二值化处理
    thresh = cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
    # 返回处理后的图像
    return thresh

# 定义特征提取函数
def extract_features(image):
    # 创建 ORB 特征检测器
    orb = cv2.ORB_create()
    # 检测关键点并计算描述符
    keypoints, descriptors = orb.detectAndCompute(image, None)
    # 返回关键点和描述符
    return keypoints, descriptors

# 定义特征匹配函数
def match_features(descriptors1, descriptors2):
    # 创建 BFMatcher 对象，使用 Hamming 距离进行匹配
    bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
    # 匹配描述符
    matches = bf.match(descriptors1, descriptors2)
    # 按距离排序匹配结果
    matches = sorted(matches, key=lambda x: x.distance)
    # 返回匹配结果
    return matches

# 定义指纹对比函数
def compare_fingerprints(image_path1, image_path2, threshold_percent=0.8):
    # 预处理第一张图像
    image1 = preprocess_image(image_path1)
    # 预处理第二张图像
    image2 = preprocess_image(image_path2)

    # 提取第一张图像的特征
    keypoints1, descriptors1 = extract_features(image1)
    print(f"descriptors1: {len(descriptors1)}")
    threshold = int(len(descriptors1) * threshold_percent)
    # 提取第二张图像的特征
    keypoints2, descriptors2 = extract_features(image2)
    print(f"descriptors2: {len(descriptors2)}")

    # 如果任一图像没有提取到特征，返回 False
    if descriptors1 is None or descriptors2 is None:
        return False

    # 匹配两组特征
    matches = match_features(descriptors1, descriptors2)

    print(f"匹配度: {len(matches)/len(descriptors1)*100:.2f}%")
    # 如果匹配数超过阈值，认为指纹相同
    if len(matches) > threshold:
        return True
    # 否则认为指纹不同
    return False

# 主函数入口
if __name__ == "__main__":
    # 创建参数解析器
    parser = argparse.ArgumentParser(description="Fingerprint Recognition")
    # 添加第一个图像路径参数
    parser.add_argument("--image1", type=str, required=True, help="Path to the first fingerprint image")
    # 添加第二个图像路径参数
    parser.add_argument("--image2", type=str, required=True, help="Path to the second fingerprint image")
    # 添加匹配度
    parser.add_argument("--match", type=float, required=True, help="match 0-1")
    # 解析命令行参数
    args = parser.parse_args()

    # 调用指纹对比函数，传入解析到的参数
    is_same = compare_fingerprints(args.image1, args.image2, args.match)
    # 根据对比结果输出信息
    if is_same:
        print("这两个指纹可能是同一个人的。")
    else:
        print("这两个指纹不是同一个人的。")